/*
 * @Author: intellectual-seeker 3336339701@qq.com
 * @Date: 2025-08-21 12:09:12
 * @LastEditors: intellectual-seeker 3336339701@qq.com
 * @LastEditTime: 2025-08-21 21:30:46
 * @FilePath: /code/lesson28/mykill.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <sys/types.h>
#include <signal.h>
#include <iostream>
using namespace std;
#include <cerrno>
#include <cstring>
#include <stdlib.h>
#include <unistd.h>

int cnt = 0;

void handler(int signo)
{
    cout << "除0异常 , SIGFPE : " << signo << " cnt : " << cnt++ << endl;
}

int main()
{
    signal(SIGFPE, handler);

    int a = 10;
    a /= 0;

    return 0;
}

// int cnt = 0;

// void handler(int signo)
// {
//     cout << "Alarm clock , cnt : " << cnt << endl;
//     exit(0);
// }

// int main()
// {
//     signal(SIGALRM, handler);

//     alarm(1);

//     while(true)
//     {
//         cnt++;
//     }

//     return 0;
// }

// int main()
// {
//     alarm(1);

//     int cnt = 0;
//     while(true)
//     {
//         cout << "cnt : " << cnt++ << endl;
//     }

//     return 0;
// }

//野指针异常
// void handler(int signo)
// {
//     cout << "野指针错误 , SIGSEGV : 11" << endl;
//     exit(1);
// }

// int main()
// {
//     signal(SIGSEGV, handler);

//     int* p = nullptr;
//     *p = 100;

//     return 0;
// }

//除0异常
// void handler(int signo)
// {
//     cout << "除0错误 , SIGFPE : 8" << endl;
//     exit(1);
// }

// //除0异常
// int main()
// {
//     signal(SIGFPE, handler);

//     int a = 10;
//     a /= 0;

//     return 0;
// }

// int main(int argc, char* argv[])
// {
//     if(argc != 3)
//     {
//         cout << "Usage: " << argv[0] << " -signum " << "pid" << endl;
//         exit(1);
//     }

//     pid_t pid = stoi(argv[2]);
//     int signo = stoi(argv[1] + 1);//地址往后位移1字节，忽略'-'

//     int n = kill(pid, signo);
//     if(n < 0)
//     {
//         cout << "mykill error , errno : " << errno << " string error : " << strerror(errno) << endl;
//     }

//     return 0;
// }